<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>简单排序</title>
</head>
<body>
    <script>
        // 封装一个数组列表用于存储数据
        function ArranyList (){
            this.array = []
            ArranyList.prototype.insert = function (item){
                this.array.push(item)
            }
            ArranyList.prototype.toString = function (){
                return this.array.join()
            }

            // 冒泡排序
            ArranyList.prototype.bubbleSort = function(){
            var length = this.array.length
            // 反向循环
            for (let i = length-1; i >=0; i--) {
                for (let j = 0; j < i; j++) {
                    if(this.array[j+1]<this.array[j]){
                        // 交换位置
                        this.swap(j,j+1)
                    }   
                }
            }
         }
         ArranyList.prototype.swap = function (m,n){
             var temp = this.array[m]
             this.array[m] = this.array[n]
             this.array[n] = temp
         }

         // 选择排序
         ArranyList.prototype.selectionSort = function (){
             // 获取数组长度错误
             var length = this.array.length
             // 外层循环: 从0开始取数据,直到length-1的位置
             for (let i = 0; i < length-1; i++) {
                 // 定义每次遍历一遍的最小值的初始值的下标
                 let min = i
                 for (let j = min+1; j < length; j++) {
                     // 如果i的位置的值大于j位置的值那么记录最小值的位置
                     if(this.array[min]>this.array[j]){
                         min = j
                     }
                 }
                 // 交换min和i位置的数据
                 this.swap(min,i)
             }
         }

         // 插入排序
         ArranyList.prototype.insertionSort = function () {
             // 获取数组的长度
             var length = this.array.length
             // 我们认定数据第一个已经是被排序过的
             for (let i = 1; i < length; i++) {
                 var j = i
                 var temp = this.array[i]
                 // 内层循环不确定循环的次数,所以使用while循环
                 while(j>0&&this.array[j-1]>temp){
                     this.array[j] = this.array[j-1]
                     j--
                 }
                 // 将选出来的j的位置放入temp中
                 this.array[j] = temp
             }
         }
        }
        // 初始化数据项
        var list = new ArranyList()
        list.insert(3)
        list.insert(6)
        list.insert(4)
        list.insert(2)
        list.insert(11)
        list.insert(10)
        list.insert(5)
        alert(list);
        // 测试冒泡排序
        list.bubbleSort()
        alert("冒泡排序"+list) // 2,3,4,5,6,10,11
        // 测试选择排序
        var list2 = new ArranyList()
        list2.insert(3)
        list2.insert(6)
        list2.insert(4)
        list2.insert(2)
        list2.insert(11)
        list2.insert(10)
        list2.insert(5)
        list2.selectionSort()
        alert("选择排序"+list2) // 2,3,4,5,6,10,11
    </script>
</body>
</html>